#ifndef _TM1629A_H_
#define _TM1629A_H_

#include <linux/types.h>

/*
 * TM1629A LED驱动器
 * 
 * 特性：
 * - 支持8个8段LED数码管显示
 * - 支持8级亮度调节
 * - 支持显示开关控制
 * - 支持地址自动增加和固定地址两种模式
 * - 支持共阴极和共阳极两种LED连接方式
 * 
 * sysfs接口说明：
 * 1. display_text (WO)
 *    - 用于设置显示内容
 *    - 支持数字(0-9)、字母(A-F)、小数点(.)
 *    - 示例：
 *      echo "1234" > display_text    // 显示数字
 *      echo "ABCD" > display_text    // 显示字母
 *      echo "12.34" > display_text   // 显示带小数点
 *    - 超出实际数码管数量的部分会被截断
 * 
 * 2. num_digits (RO)
 *    - 显示实际连接的数码管数量
 *    - 由设备树的num-digits属性决定
 *    - 范围：1-8，默认值：8
 *    - 示例：
 *      cat num_digits               // 读取数码管数量
 * 
 * 3. brightness (RW)
 *    - 控制显示亮度
 *    - 范围：0-7（0最暗，7最亮）
 *    - 示例：
 *      echo "5" > brightness        // 设置亮度为5
 *      cat brightness               // 读取当前亮度
 * 
 * 4. display_on (RW)
 *    - 控制显示开关
 *    - 值：0(关闭)，1(开启)
 *    - 示例：
 *      echo "0" > display_on        // 关闭显示
 *      echo "1" > display_on        // 开启显示
 * 
 * 5. addr_mode (RW)
 *    - 设置地址模式
 *    - 值：auto(自动增加)，fixed(固定地址)
 *    - 示例：
 *      echo "auto" > addr_mode      // 设置为自动增加模式
 *      echo "fixed" > addr_mode     // 设置为固定地址模式
 * 
 * 6. led_type (RO)
 *    - 显示LED连接类型
 *    - 值：common-cathode(共阴极)，common-anode(共阳极)
 *    - 示例：
 *      cat led_type                 // 读取LED类型
 * 
 * 7. segments (RW)
 *    - 直接控制段显示
 *    - 格式：<位置> <段名列表>
 *    - 段名：A-G,DP(或P)，用|分隔
 *    - 示例：
 *      echo "0 A|B|C" > segments    // 在位置0点亮A、B、C段
 *      echo "1 A|F|G|P" > segments  // 在位置1点亮A、F、G段和小数点
 *      cat segments                 // 读取所有位置的段状态
 * 
 * 通信接口：
 * - CLK: 时钟信号
 * - DIO: 双向数据线
 * - STB: 片选信号，低电平有效
 * 
 * 通信时序：
 * 1. STB拉低，选中芯片
 * 2. 发送命令或数据（LSB优先）
 * 3. STB拉高，完成传输
 */

/* TM1629A 命令定义 */
/* 显示模式命令: 0x00 */
#define TM1629A_CMD_DISPLAY_MODE    0x00  /* 设置显示模式 */

/* 数据命令: 0x40 */
#define TM1629A_CMD_DATA_SET        0x40  /* 数据命令基址 */
#define TM1629A_DATA_WRITE_INC      0x40  /* 数据写入，地址自动加1 */
#define TM1629A_DATA_WRITE_FIXED    0x44  /* 数据写入，地址保持不变 */
#define TM1629A_DATA_READ           0x42  /* 数据读取命令 */

/* 地址命令: 0xC0 */
#define TM1629A_CMD_ADDRESS_SET     0xC0  /* 设置显示RAM起始地址 */

/* 显示控制命令: 0x80 */
#define TM1629A_CMD_DISPLAY_CTRL    0x80  /* 显示控制命令基址 */

/* 显示控制命令 */
#define TM1629A_DISPLAY_OFF         0x00  /* 关闭显示 */
#define TM1629A_DISPLAY_ON          0x08  /* 打开显示 */

/* 亮度级别 (0-7) */
#define TM1629A_BRIGHTNESS_MIN      0x00  /* 最小亮度 */
#define TM1629A_BRIGHTNESS_MAX      0x07  /* 最大亮度 */

/* 地址模式 */
enum tm1629a_addr_mode {
    TM1629A_ADDR_AUTO_INC,    /* 地址自动增加模式：写入数据后地址自动加1 */
    TM1629A_ADDR_FIXED        /* 固定地址模式：写入数据后地址保持不变 */
};

/* LED类型定义 */
enum tm1629a_led_type {
    TM1629A_COMMON_CATHODE = 0,  /* 共阴极：LED阳极连接段选，阴极连接位选 */
    TM1629A_COMMON_ANODE         /* 共阳极：LED阴极连接段选，阳极连接位选 */
};

/*
 * 平台数据结构
 * 用于从设备树或平台数据中获取配置信息
 */
struct tm1629a_platform_data {
    int gpio_clk;                /* 时钟GPIO引脚编号 */
    int gpio_dio;                /* 数据GPIO引脚编号 */
    int gpio_stb;                /* 片选GPIO引脚编号 */
    enum tm1629a_led_type led_type;  /* LED连接类型（共阴/共阳） */
};

/*
 * 段码定义（共阴极模式下）
 * 
 * 数码管段位排列：
 *      A
 *    F   B
 *      G
 *    E   C
 *      D   DP
 *
 * 段位与位码对应关系：
 * D7 D6 D5 D4 D3 D2 D1 D0
 * DP G  F  E  D  C  B  A
 */

/* 段位定义 */
#define TM1629A_SEG_A    0x01  /* A段 (0b00000001) */
#define TM1629A_SEG_B    0x02  /* B段 (0b00000010) */
#define TM1629A_SEG_C    0x04  /* C段 (0b00000100) */
#define TM1629A_SEG_D    0x08  /* D段 (0b00001000) */
#define TM1629A_SEG_E    0x10  /* E段 (0b00010000) */
#define TM1629A_SEG_F    0x20  /* F段 (0b00100000) */
#define TM1629A_SEG_G    0x40  /* G段 (0b01000000) */
#define TM1629A_SEG_DP   0x80  /* 小数点 (0b10000000) */

#endif /* _TM1629A_H_ */ 